#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/string.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION(
	"A simple example of creating a sysfs file using struct attribute");

// 定义sysfs文件的存储数据
static char my_data[256] = "Hello, sysfs!\n";

/*
numa 0 dev stats:
Queue0: head %d tail %d  onflight %d // 

numa 1 dev stats:
...


*/
static ssize_t queue_stats_show(struct kobject *kobj,
				struct kobj_attribute *attr, char *buf)
{
	return sprintf(buf, "%s", my_data);
}

#if 0
// 定义store函数（写入文件时调用）
static ssize_t queue_stats_store(struct kobject *kobj,
				 struct kobj_attribute *attr, const char *buf,
				 size_t count)
{
	// 将用户空间的数据拷贝到内核空间
	strncpy(my_data, buf, sizeof(my_data) - 1);
	my_data[sizeof(my_data) - 1] = '\0'; // 确保字符串以NULL结尾
	return count;
}
#endif

// 定义kobj_attribute
static struct kobj_attribute my_kobj_attr =
	__ATTR(queue_stats, 0444, queue_stats_show, NULL);

// 定义属性组
static struct attribute *attrs[] = {
	&my_kobj_attr.attr,
	NULL, // 结束标志
};

// 定义attribute_group
static struct attribute_group queue_stats_group = {
	.attrs = attrs,
};

// 定义kobject
static struct kobject *my_kobj;

// 模块初始化函数
static int __init my_module_init(void)
{
	int ret;

	// 创建一个kobject，并将其添加到/sys/kernel/目录下
	my_kobj = kobject_create_and_add("phyce_debug", kernel_kobj);
	if (!my_kobj) {
		pr_err("Failed to create kobject\n");
		return -ENOMEM;
	}

	// 创建sysfs文件
	ret = sysfs_create_group(my_kobj, &queue_stats_group);
	if (ret) {
		pr_err("Failed to create sysfs group\n");
		kobject_put(my_kobj); // 释放kobject
		return ret;
	}

	pr_info("Sysfs file created successfully at /sys/kernel/phyce_debug/queue_stats\n");
	return 0;
}

// 模块退出函数
static void __exit my_module_exit(void)
{
	// 删除sysfs文件
	sysfs_remove_group(my_kobj, &queue_stats_group);
	kobject_put(my_kobj); // 释放kobject

	pr_info("Sysfs file removed\n");
}

module_init(my_module_init);
module_exit(my_module_exit);